﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using Data;
using RegistroMascotas.Modelo;
using System.Net.Mail;
using System.Net;
using System.Configuration;

namespace Service
{
    public class GestorMascota
    {        
        public static bool modificarMascotaHechaPorDueño(int idMascota,string estado,string cadenaImagen){
            bool exito = false;

            try
            {
                exito = MascotaDAO.modificarMascotaHechaPorDueño(idMascota, estado, cadenaImagen);
            }
            catch (Exception ex)
            {                
                throw ex;
            }
            return exito;
        }

        public static bool modificarMascotaHechaPorVeterinario(int idMascota, HistoriaClinica h)
        {
            bool exito = false;

            try
            {
                exito = MascotaDAO.modificarMascotaHechaPorVeterinario(idMascota, h);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return exito;
        }

        public static Dueño obtenerDueño(int idDueño){
            Dueño d = null;

            try
            {
                d = MascotaDAO.obtenerDueño(idDueño);

                if(d == null){
                    throw new Exception("Esta mascota no tiene dueño.");
                }
            }
            catch (Exception ex)
            {                
                throw ex;
            }

            return d;
        }

        public static HistoriaClinica obtenerHistoriaClinica(int idMascota)
        {
            HistoriaClinica hC = null;
            int dias = 0;
            bool exito = false;

            try
            {
                hC = MascotaDAO.obtenerHistoriaClinica(idMascota);

                if (hC == null)
                {
                    throw new Exception("Esta mascota no tiene historia clínica.");
                }

                if (hC.FechaUltimaModificacion != null)
                {
                    dias = DateTime.Now.Day - hC.FechaUltimaModificacion.Day;
                }
                else
                {
                    dias = DateTime.Now.Day - hC.FechaCreacion.Day;
                }

                if(dias >= 365){
                    string mail = MascotaDAO.obtenerMailMunicipio(idMascota);
                    Mascota m = MascotaDAO.obtenerMascotaPorId(idMascota);
                    Dueño d = MascotaDAO.obtenerDueñoPorIdMascota(idMascota);

                    exito = mandarMail(mail, m.Nombre, d.Nombre, d.Dni);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return hC;
        }

        public static Mascota obtenerMascotaDetalle(int idMascota) {
            Mascota miMascota = null;
            int dias = 0;
            bool exito = false;

            try
            {
                miMascota = MascotaDAO.obtenerMascotaDetalle(idMascota);

                if (miMascota == null)
                    throw new Exception("No hay datos para la mascota seleccionada.");

                if (miMascota.FechaUltimaModificacion != null)
                {
                    dias = DateTime.Now.Day - miMascota.FechaUltimaModificacion.Day;
                }
                else
                {
                    dias = DateTime.Now.Day - miMascota.FechaCreacion.Day;
                }

                if (dias >= 365)
                {
                    string mail = MascotaDAO.obtenerMailMunicipio(idMascota);
                    Mascota m = MascotaDAO.obtenerMascotaPorId(idMascota);
                    Dueño d = MascotaDAO.obtenerDueñoPorIdMascota(idMascota);

                    exito = mandarMail(mail, m.Nombre, d.Nombre, d.Dni);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return miMascota;
        }

        public static bool crearMascota(Mascota pet){
            bool hayTransaccion = false;
            SqlTransaction tran;
            SqlConnection conn;
            bool exito = false;
            
            try
            {
                conn = new SqlConnection(ConfigurationManager.ConnectionStrings["CadenaConn"].ConnectionString);

                conn.Open();
                tran = conn.BeginTransaction();
                hayTransaccion = true;

                exito = MascotaDAO.crearMascota(pet, conn, tran, hayTransaccion);
            }
            catch (Exception e)
            {                
                throw e;
            }

            return exito;
        }

        public static bool modificarChapita(Chapita c) {
            bool exito = true;
            
            try
            {
                exito = MascotaDAO.modificarChapita(c);    
            }
            catch (Exception e)
            {                
                throw e;
            }

            return exito;
        }
        
        public static DataTable obtenerMascotasRegistradasPorDia(DateTime dia)
        {
            DataTable dtMascotas = null;

            try
            {
                if (DateTime.Compare(dia, DateTime.Now) == 1)
                    throw new Exception("El dia ingresado no puede ser mayor al dia de hoy.");

                dtMascotas = MascotaDAO.obtenerMascotasRegistradasPorDia(dia);

                if (dtMascotas == null)
                    throw new Exception("No hay mascotas registradas para la fecha elegida.");
            }
            catch (Exception ex)
            {                
                throw ex;
            }

            return dtMascotas;
        }

        public static bool adoptarMascota(int idMascota, int idDueño) {
            bool exito = false;

            try
            {
                exito = MascotaDAO.adoptarMascota(idMascota, idDueño);

                if (!exito)
                    throw new Exception("No se pudo adoptar a la mascota.");                
            }
            catch (Exception ex)
            {                
                throw ex;
            }
            return exito;
        }

        private static bool mandarMail(string destinatario, string nombreMascota, string nombreDueño, long dni) {
            bool exito = false;

            //creamos el objeto mail
            MailMessage msg = new MailMessage();

            msg.To.Add(new MailAddress(destinatario));
            msg.From = new MailAddress("info@renacmas.com.ar");
            msg.Subject = "Registro Provincial de Mascotas: Datos desactualizados de dueño.";
            msg.Body = "A quien corresponda: Le informamos que el usuario " + nombreDueño + " con el DNI " + dni +" , ha sobrepasado el limite de tiempo "+
                        " para actualizar los datos de su mascota: " + nombreMascota + ". Lo cual deberá correr el correspondiente abonodo de la multa. \n Reg Nac Mas.";

            SmtpClient smtp = new SmtpClient();

            smtp.Credentials = new NetworkCredential(msg.From.Address, "renacmas000");

            smtp.Host = "mail.renacmas.com.ar";
            smtp.Port = 25;
            smtp.EnableSsl = false;

            try
            {
                smtp.Send(msg);
                exito = true;
                msg.Dispose();
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return exito;
        }
    }
}
